﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using InTREPWP.ViewModels;
using Newtonsoft.Json;
using System.Collections.ObjectModel;
using Microsoft.Phone.Shell;
using System.ComponentModel;

namespace InTREPWP.Views
{
    public partial class Detalhes : BasePage
    {
        private string _embarqueId;
        private bool _itenscarregados;

        public EmbarqueViewModel EmbarqueAtual { get; set; }

        #region Page
        // Constructor
        public Detalhes()
        {
            InitializeComponent();
            _itenscarregados = false;

            this.Loaded += new RoutedEventHandler(Detalhes_Loaded);
        }

        void Detalhes_Loaded(object sender, RoutedEventArgs e)
        {
            NavigationContext.QueryString.TryGetValue("id", out _embarqueId);

            progressBar.Visibility = System.Windows.Visibility.Visible;
            stkDetalhes.Visibility = System.Windows.Visibility.Collapsed;

            BackgroundWorker bw = new BackgroundWorker();

            bw.RunWorkerCompleted += (s, ea) =>
                {
                    Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        progressBar.Visibility = System.Windows.Visibility.Collapsed;
                        stkDetalhes.Visibility = System.Windows.Visibility.Visible;
                    });
                };

            bw.DoWork += (s, ea) => CarregaEmbarque(_embarqueId);

            bw.RunWorkerAsync();
        }

        // When page is navigated to set data context to selected item in list
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
        }        
        #endregion

        #region ApplicationBar
        private void ApplicationBarPause_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Tem certeza que deseja solicitar uma pausa para este embarque?", "Pausar embarque", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
                SolicitarPausa(Convert.ToInt32(_embarqueId));
        }


        private void ApplicationBarContinuar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Tem certeza que deseja solicitar a continuação deste embarque?", "Continuar embarque", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
                SolicitarContinuacao(Convert.ToInt32(_embarqueId));
        }

        private void ApplicationBarEmail_Click(object sender, EventArgs e)
        {
            NavigationService.Navigate(new Uri("/Views/Mensagem.xaml?id=" + _embarqueId, UriKind.Relative));
        }
        private void ApplicationBarMenuSobre_Click(object sender, EventArgs e)
        {
            NavigationService.Navigate(new Uri("/Views/Sobre.xaml", UriKind.Relative));
        }
        #endregion

        #region Mensagens
        private void SolicitarPausa(int _embarqueId)
        {
            MensagemViewModel mensagem = new MensagemViewModel
            {
                IMEI = Settings.IMEI.Value,
                Assunto = "ATENÇÃO!",
                Mensagem = "PARE O EMBARQUE IMEDIATAMENTE!"
            };

            EnviarMensagem(mensagem);
        }

        private void SolicitarContinuacao(int _embarqueId)
        {
            MensagemViewModel mensagem = new MensagemViewModel
            {
                IMEI = Settings.IMEI.Value,
                Assunto = "ATENÇÃO!",
                Mensagem = "CONTINUE O EMBARQUE IMEDIATAMENTE!"
            };

            EnviarMensagem(mensagem);
        }

        private void EnviarMensagem(MensagemViewModel mensagem)
        {
            mensagem.EmbarqueId = Convert.ToInt32(_embarqueId);

            String json = JsonConvert.SerializeObject(mensagem);

            using (IntrepService service = new IntrepService())
            {
                String retornojson = service.EnviarMensagem(json);

                RetornoViewModel retorno = JsonConvert.DeserializeObject<RetornoViewModel>(retornojson);

                if (retorno.Ok)
                    MessageBox.Show("Mensagem Enviada com sucesso.", "Sucesso!", MessageBoxButton.OK);
            }
        }
        #endregion

        #region Pivot
        private void Pivot_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (!_itenscarregados && ((PivotItem)pivot.SelectedItem).Header.Equals("itens"))
            {
                progressBar.Visibility = System.Windows.Visibility.Visible;
                stkItens.Visibility = System.Windows.Visibility.Collapsed;

                BackgroundWorker bw = new BackgroundWorker();

                bw.RunWorkerCompleted += (s, ae) =>
                    {
                        Deployment.Current.Dispatcher.BeginInvoke(() =>
                        {
                            progressBar.Visibility = System.Windows.Visibility.Collapsed;
                            stkItens.Visibility = System.Windows.Visibility.Visible;
                        });
                    };

                bw.DoWork += (s, ae) => CarregaItens();

                bw.RunWorkerAsync();
            }
        }        
        #endregion

        #region Carregamento
        private void CarregaEmbarque(string id)
        {
            System.Threading.Thread.Sleep(3000);

            if (App.DadosLocais.Embarques.Any(x => x.Id.ToString().Equals(id)))
            {
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    var embarque = App.DadosLocais.Embarques.Where(x => x.Id.ToString().Equals(id)).Single();
                    if (embarque.Concluido >= 100)
                        ApplicationBar.IsVisible = false;

                    DataContext = embarque;
                });
            }
            else
            {

                String json = JsonConvert.SerializeObject(id);

                using (IntrepService service = new IntrepService())
                {
                    String retornojson = service.ObterDetalhesEmbarque(json);

                    Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        var embarque = JsonConvert.DeserializeObject<EmbarqueViewModel>(retornojson);

                        if (embarque.Concluido >= 100)
                            ApplicationBar.IsVisible = false;

                        DataContext = embarque;
                    });
                }
            }
        }

        private void CarregaItens()
        {
            using (IntrepService service = new IntrepService())
            {
                IEnumerable<ItemDeEmbarqueViewModel> itenscarregados = null;

                Deployment.Current.Dispatcher.BeginInvoke(
                    () =>
                    {
                        itenscarregados = App.DadosLocais.Embarques.Where(x => x.Id.ToString().Equals(_embarqueId)).First().Itens;
                    });

                if (itenscarregados == null || itenscarregados.Count() == 0)
                {
                    System.Threading.Thread.Sleep(3000);

                    String json = JsonConvert.SerializeObject(_embarqueId);

                    var retorno = service.ObterItensEmbarque(json);

                    var novositens = JsonConvert.DeserializeObject<ObservableCollection<ItemDeEmbarqueViewModel>>(retorno);

                    Deployment.Current.Dispatcher.BeginInvoke(
                    () =>
                    {
                        App.DadosLocais.Embarques.Where(x => x.Id.ToString().Equals(_embarqueId)).Single().Itens = novositens;
                    });
                }
            }
        }
        #endregion
    }
}